我已经看到一些网页说"a = b ||'blah'"应该将'blah'分配给a,如果b未定义或为null.但是,如果我在Firebug中键入它或在代码中使用它,它会在FF3/win列表中抱怨b未定义.任何提示?
编辑:我正在寻找b可能根本不存在的情况.例如,没有id的DOM节点.
如果b存在,并且是false,null等,那么它将以您期望的方式工作.所有你需要做的就是上面的那条线,放var b = null
;
如果你考虑一下,这是有道理的.它基本上做了这样的事......
a = function(){ if(b){return b;} else{ return 'blah' } }();
请注意,它检查b的值是否真实...如果b不存在,则会出现异常.
javascript中的"未定义"并不意味着"变量不存在".它意味着"变量的值是undefined
" 的特殊值.例:
alert(nosuchvariable); => throws exception var somevariable; // note it's never assigned alert(somevariable); => This alerts with 'undefined'
因此,如果我们尝试阅读b
并且没有b这样的变量,我们会得到一个例外.如果我们试图找出是否定义了b,那么这没有用.
您可以通过检查顶级window
对象来查看是否存在全局变量.所有全局变量实际上只是window
对象中的字段.例:
foo = 'Hello'; alert( window.foo ); => alerts 'Hello'
因为您知道窗口对象已经存在,所以您可以检查它的字段.
检查javascript中不存在的字段会给你undefined
并且不会崩溃,因此你可以进行合并,或者放入undefined
变量或其他
对于局部变量(用声明的东西var
),你无法检查它们的存在.它们不会以全局变量"生活"在窗口对象中的方式"生活",并且任何引用它的正常尝试都将导致异常:例如:
alert(a); => exception because a is meaningless alert(d45pwiu4309m9rv43); => exception because that is equally meaningless
然而,有一个例外(我知道,感谢评论中的J c),typeof
运营商.如果你尝试获得不存在的东西的类型,它将不会崩溃,它将返回字符串 "undefined"
.
这为您提供了一种检查不存在的局部变量的方法.例如:
if( typeof(djfsd) === "undefined" ) alert('no such variable');
有几条评论提到没有ID的DOM元素等等......
事实上,它是一个DOM元素并不真正相关.将DOM视为数据库或文件,将元素视为该数据库中的行或该文件中的单词.为了对它做任何事情,你必须搜索数据库,找到正确的行,然后将数据拉出来.数据被放入javascript对象中.然后,您可以通过操作该对象来访问它,并且可以根据需要将对象放在变量中.例:
document.getElementById('foo');
这进入dom并查找ID为'foo'的元素.如果找到一个,它会将有关该元素的一些信息放入javascript对象中,然后将该对象交还给您.如果它找不到元素,它会将你送回去null
,但所有正常的规则仍然适用(你可以坚持null
使用变量,或其他任何东西).
它根本不会影响合并.